package com.anlu.concurrent.ch2.tools;

import com.anlu.concurrent.utils.SleepTools;

import java.util.concurrent.CountDownLatch;

/**
 * <p>
 * Description:演示CountDownLatch，有5个初始化的线程，6个扣除点，
 *  扣除完毕以后，主线程和业务线程才能继续自己的工作
 * <p>
 * Copyright: 天津联想协同科技有限公司
 * <p>
 *
 * @author anlu
 * @date 2021/9/7 9:47
 */
public class UseCountDownLatch {

    static CountDownLatch latch = new CountDownLatch(6);

    /**
     * 初始化线程
     */
    private static class InitThread implements Runnable{

        @Override
        public void run() {
            System.out.println("Thread_"+Thread.currentThread().getId()
                    +" ready init work......");
            // 初始化方法完成了，countDown方法扣减一次
            latch.countDown();//初始化线程完成工作了，countDown方法只扣减一次；
            for (int i=0;i<2;i++){
                System.out.println("Thread_"+Thread.currentThread().getId()
                        +" ........continue do its work");
            }
        }
    }

    /**
     * 业务线程
     */
    private static class BusiThread implements Runnable{

        @Override
        public void run() {
            try{
                latch.await();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            for(int i =0;i<3;i++) {
                System.out.println("BusiThread_"+Thread.currentThread().getId()
                        +" do business-----");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException{
        // 单独的初始化线程，初始化分2步，需要扣减2次
        new Thread(new Runnable() {
            @Override
            public void run() {
                SleepTools.ms(1);
                System.out.println("Thread_"+Thread.currentThread().getId()
                        +" ready init work step 1st......");
                latch.countDown();//每完成一步初始化工作，扣减一次
                System.out.println("begin step 2nd.......");
                SleepTools.ms(1);
                System.out.println("Thread_"+Thread.currentThread().getId()
                        +" ready init work step 2nd......");
                latch.countDown();//每完成一步初始化工作，扣减一次
            }
        }).start();
        new Thread(new BusiThread()).start();
        for(int i=0;i<=3;i++){
            Thread thread = new Thread(new InitThread());
            thread.start();
        }

        latch.await();
        System.out.println("Main do ites work........");
    }

}
